//908. 最小差值 I
class Solution {
public:
    int smallestRangeI(vector<int>& nums, int k) {
        int n=nums.size();
        if(n==1)
        return 0;
        //
        // sort(nums.begin(),nums.end());
        // int max=nums[n-1];
        // int min=nums[0];
        // if(max<=min+2*k)
        //     return 0;
        // else
        //     return max-min-2*k;
        int max=nums[0];
        int min=nums[0];
        for(int i=0;i<n;i++)
        {
            if(nums[i]<min)
                min=nums[i];
            if(nums[i]>max)
                max=nums[i];
        }
        
        if(max<=min+2*k)
            return 0;
        else
            return max-min-2*k;
    }
};

//910. 最小差值 II
class Solution {
public:
    int smallestRangeII(vector<int>& nums, int k) {
        int n=nums.size();
        if(n==1)
            return 0;
        // vector<int> nums2(nums.begin(),nums.end());
        // for(int i=0;i<n;+++)
        // {
        //     nums[i]+=k;
        //     nums2[i]-=k;
        // }
        sort(nums.begin(),nums.end());
        int ret=nums[n-1]-nums[0];
        for(int i=1;i<n;i++)
        {
            int mi=min(nums[0]+k,nums[i]-k);
            int ma=max(nums[n-1]-k,nums[i-1]+k);
            ret=min(ret,ma-mi);
            cout<<ret<<endl;
        }
        return ret;
    }
};

//3184. 构成整天的下标对数目 I
class Solution {
public:
    int countCompleteDayPairs(vector<int>& hours) {
        vector<int> data(24,0);
        for(auto& e:hours)
        {
            data[e%24]++;
        }
        int res=(data[0]>1?((data[0]-1)*data[0]/2):0)+(data[12]>1?((data[12]-1)*data[12]/2):0);
        //cout<<res;
        for(int i=1;i<12;i++)
        {
            //cout<<i<<' '<<data[i]<<' '<<data[24-i]<<endl;
            if(data[i]>0&&data[24-i])
                res+=data[i]*data[24-i];
            //cout<<i<<' '<<res<<endl;
        }
        return res;
    }
};

//3185. 构成整天的下标对数目 II
class Solution {
public:
    long long countCompleteDayPairs(vector<int>& hours) {
        // vector<long long> data(24,0.0);
        // for(auto& e:hours)
        // {
        //     data[e%24]++;
        // }
        // long long res=(data[0]-1)*data[0]/2+(data[12]-1)*data[12]/2;
        // //cout<<res;
        // for(int i=1;i<12;i++)
        // {
        //     //cout<<i<<' '<<data[i]<<' '<<data[24-i]<<endl;
        //     if(data[i]>0&&data[24-i])
        //         res+=data[i]*data[24-i];
        //     //cout<<i<<' '<<res<<endl;
        // }
        // return res;
        
        const int H = 24;
        long long ans = 0;
        int cnt[H]{};
        for (int t : hours) {
            // 先查询 cnt，再更新 cnt，因为题目要求 i < j
            // 如果先更新，再查询，就把 i = j 的情况也考虑进去了
            ans += cnt[(H - t % H) % H];
            cnt[t % H]++;
        }
        return ans;
    }
};